package com.itheima.service.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.bean.Student;
import com.itheima.mapper.StudentMapper;
import com.itheima.service.StudentService;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;
import java.io.InputStream;

@Service("studentService")
@Transactional
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper mapper;

    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 分页查询方法
     * @param currentPage 当前页数
     * @param pageSize 每页展示条数
     * @return 返回PageInfo分页结果对象
     */
    @Override
    @Transactional(readOnly = true)
    public PageInfo<Student> selectByPage(int currentPage, int pageSize) {
        //设置分页数据（当前页和每页展示的条数）
        PageHelper.startPage(currentPage,pageSize);
        //执行操作
        Page<Student> page = mapper.findAll();
        //封装分页信息
        //6 返回结果
        return new PageInfo<>(page);
    }

    /**
     * 添加学生信息
     * @param student 要添加的学生对象
     * @return 返回影响的行数，1表示成功，0表示失败
     */
    @Override
    public int addStudent(Student student) {
        return mapper.addStudent(student);
    }

    /**
     * 修改学生的方法
     * @param student 要修改的学生对象
     * @return 返回影响的行数，1表示成功，0表示失败
     */
    @Override
    public int updateStudent(Student student) {
        return mapper.updateStudent(student);
    }

    /**
     * 删除学生的方法
     * @param number 学生的编号
     * @return 返回影响的行数，1表示成功，0表示失败
     */
    @Override
    public int deleteStudent(String number) {
        int count=mapper.deleteStudent(number);
        //int i= 1/0;
        return count;
    }
    /**
     * 根据number查询学生信息
     * @param number
     * @return
     */
    @Override
    public Student findByNumber(String number) throws IOException {
        //优先从redis中获取学生信息
        String studentJson = (String) redisTemplate.opsForValue().get("student:number:" + number);
        if(studentJson!=null && studentJson.length()>0){
            ObjectMapper objectMapper=new ObjectMapper();
            Student student = objectMapper.readValue(studentJson, Student.class);
            System.out.println("从redis中获取了学生信息。。。");
            return student;
        }else{
            System.out.println("从mysql中获取了学生信息。。。");
            //如果从redis中没有获取到，那么就直接调用mapper访问数据
            return mapper.findByNumber(number);
        }
    }
}
